package com.yc.thread.wait.cp;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 生产者，消费者
 */
public class Demo2 {
	
	volatile List<String> content = new ArrayList<String>(100);
	
	public void m1() {
		System.out.println(content.size());
		try {
			Thread.sleep(100000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		for (int i = 0; i < 2; i++) {//两个生产者
			new Thread(new Producer(), "Producer" + i).start();
		}
		for (int i = 0; i < 10; i++) {//10个消费者
			new Thread(new Custom(), "Custom" + i).start();
		}
	}
	
	Object lockedObj = new Object();
	Object lockedObj_p = new Object();
	Object lockedObj_c = new Object();
	
	class Producer implements Runnable {
		
		@Override
		public void run() {
			while(true) {
				synchronized(lockedObj) {
					System.out.println("<<<<<<<<" + Thread.currentThread().getName());
					while (content.size() >= 100) {//不能用if，再次被唤醒需要再回来判断一下
						try {
							System.out.println("-------Producer------");
							lockedObj.wait();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
//					System.out.println(Thread.currentThread().getName() + "生产");
					content.add(Thread.currentThread().getName());
					try {
						Thread.sleep(1);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					//唤醒其他所有线程，包括：本线程和其他生产者是个什么运行逻辑，和其他消费者呢：都是同步关系，一次只能进入synchronized块一个
					//	1. 本线程: 
					//	2. 其他生产者：
					//	3. 其他消费者：
					lockedObj.notifyAll();
					System.out.println(">>>>>>>>" + Thread.currentThread().getName());
				}
			}
			
		}
		
	}
	
	class Custom implements Runnable {
		
		@Override
		public void run() {
			while(true) {
				synchronized(lockedObj) {
					System.out.println(Thread.currentThread().getName() + "<<<<<<<<");
					while (content.size() <= 0) {//不能用if，再次被唤醒需要再回来判断一下
						try {
							System.out.println("-------Custom------");
							lockedObj.wait();
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
//					System.out.println(Thread.currentThread().getName() + "消费" + content.get(0));
					content.remove(0);
					try {
						Thread.sleep(5);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
					
					lockedObj.notifyAll();//让生产者开始生产
					System.out.println(Thread.currentThread().getName() + ">>>>>>>>");
				}
			}
			
		}
		
	}

	public static void main(String[] args) {
		Demo2 d = new Demo2();
		d.m1();

	}

}
